from fastapi import FastAPI, File, UploadFile
from typing import List

app = FastAPI()

# file：bytes = File(): 适合小文件上传

@app.post("/files/")
async def create_file(file: bytes = File()):
    """
    处理单个文件上传（适用于小文件）

    Args:
        file (bytes): 上传的文件数据，以字节形式表示

    Returns:
        dict: 包含文件大小的字典，键为"file_size"
    """
    if not file:
        return {"error": "未选择文件"}

    print("file路径：", file)
    return {"file_size": len(file)}

@app.post('/multiFiles/')
async def create_files(files: List[bytes] = File()):
    """
    处理多个文件上传（适用于小文件）

    Args:
        files (List[bytes]): 上传的文件数据列表，每个文件以字节形式表示

    Returns:
        dict: 包含所有文件大小的字典，键为"file_sizes"
    """
    return {"file_sizes": [len(files) for files in files]}

# file：UploadFile：适合大文件上传
@app.post('/uploadsFile/')
async def create_upload_file(file: UploadFile):
    """
    处理单个文件上传（适用于大文件）

    Args:
        file (UploadFile): 上传的文件对象，支持异步读取

    Returns:
        dict: 包含文件名的字典，键为"filename"
    """
    # 分块读取文件内容并写入到新文件中，避免内存溢出
    with open(f"{file.filename}", 'wb') as f:
        for chunk in iter(lambda: file.file.read(1024), b''):
            f.write(chunk)
    return {"filename": file.filename}

@app.post('/multiUploadFiles/')
async def create_upload_files(files: List[UploadFile]):
    """
    处理多个文件上传（适用于大文件）

    Args:
        files (List[UploadFile]): 上传的文件对象列表

    Returns:
        dict: 包含所有文件名的字典，键为"filenames"
    """
    return {"filenames": [file.filename for file in files]}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

